# 集合
# 用于数据集的关系运算（交、并、补、差）和去重

# 定义
# 使用{}内用逗号分割元素，
# 集合中的元素不能重复
# 元素必须为不可变类型，
# 集合中的元素无序
s = {1, 2}
s1 = set({1, 2})

# 类型转换 被转换的容器中的元素只能是不可变类型
s2 = set([1, 2, 3])
print(s2)  # {1, 2, 3}
s3 = set('hellollll')  # 集合自动去重
print(s3)  # {'l', 'o', 'h', 'e'}

# 集合通过符号进行关系运算
set1 = {'jack', 'tom', 'lucy', 'roy'}
set2 = {'carl', 'jack', 'lucy', 'chris'}

# 交集
res = set1 & set2
print(res)  # {'jack', 'lucy'}
# 并集
res = set1 | set2
print(res)  # {'lucy', 'tom', 'roy', 'jack', 'chris', 'carl'}
# 差集
res = set1 - set2
print(res)  # {'roy', 'tom'}
res = set2 - set1
print(res)  # {'chris', 'carl'}
# 对称差集（两个集合不同元素的并集）
res = (set1 - set2) | (set2 - set1)  # 普通方法
print(res)  # {'carl', 'chris', 'roy', 'tom'}
res = set1 ^ set2  # ^符号
print(res)  # {'carl', 'chris', 'roy', 'tom'}
# 父子集 包含关系
set1 = {1, 2, 3}
set2 = {1, 2, 3, 4}
print(set1 > set2)  # False
print(set2 > set1)  # True

# 常用方法
set1 = {'jack', 'tom', 'lucy', 'roy'}
set2 = {'carl', 'jack', 'lucy', 'chris'}
# 交集
res = set1.intersection(set2)
print(res)  # {'jack', 'lucy'}
# 并集
res = set1.union(set2)
print(res)  # {'tom', 'roy', 'carl', 'chris', 'jack', 'lucy'}
# 差集
res = set1.difference(set2)
print(res)  # {'tom', 'roy'}
# 对称差集
res = set1.symmetric_difference(set2)
print(res)  # {'roy', 'chris', 'carl', 'tom'}
# 父子集 包含关系
set1 = {1, 2, 3}
set2 = {1, 2, 3, 4}
print(set1.issubset(set2))  # True
print(set1.issuperset(set2))  # False

# 增加元素
# add 增加元素
set1 = {1, 2}
set1.add(3)
print(set1)  # {1, 2, 3}

# 删除元素
# discard 如果元素存在则删除，否则不做任何操作
set1 = {1, 2, 3}
set1.discard(3)
print(set1)  # {1, 2}
set1.discard(4)
print(set1)  # {1, 2}

# remove 如果元素存在则删除，否则抛出KeyError异常
set1 = {1, 2, 3}
set1.remove(3)
print(set1)  # {1, 2}
# set1.remove(4)  # 报错

# pop 随机删除一个元素
set1 = {1, 2, 3, 4, 5, 6}
set1.pop()
print(set1)  # {2, 3, 4, 5, 6}

# 更新
# update 更新集合 将新集合的元素添加到老集合
set1 = {1, 2, 3}
set2 = {1, 2, 4}
set1.update(set2)
print(set1)  # {1, 2, 3, 4}

# 判断集合是否有相同元素 完全不同返回True,有相同元素则返回False
set1 = {1, 2, 3}
set2 = {4, 5, 6}
print(set1.isdisjoint(set2))  # True

# 集合去重 不推荐应用面窄
# 局限性：1.只能对不可变类型 2.无法保证原来的顺序
